home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / 3DDEMO.ZIP / 3D / SOURCE / POLYLOW.ASM < prev    next >
Assembly Source File  |  1996-07-16  |  34KB  |  1,466 lines

  1.  
  2. ;    Copyright (c) 1996 by Kerrigan Burgess, all rights reserved.
  3.  
  4.                 .486
  5.  
  6.                 ASSUME  CS:_TEXT
  7.                 ASSUME  DS:_DATA
  8.  
  9. ; export Functions
  10.  
  11.                 PUBLIC Line
  12.                 PUBLIC Scan_Convert_Lambert
  13.                 PUBLIC Scan_Convert_Gouraud
  14.         
  15. ; export Data                                                
  16.  
  17.                 PUBLIC _MinClipX
  18.                 PUBLIC _MaxClipX
  19.                 PUBLIC _MinClipY
  20.                 PUBLIC _MaxClipY
  21.                 PUBLIC _ScreenWidth
  22.         PUBLIC _LookPAL
  23.                 PUBLIC _X1
  24.                 PUBLIC _X2
  25.                 PUBLIC _X3
  26.                 PUBLIC _Y1
  27.                 PUBLIC _Y2
  28.                 PUBLIC _Y3
  29.                 PUBLIC _Z1
  30.                 PUBLIC _Z2
  31.                 PUBLIC _Z3
  32.                 PUBLIC _U1
  33.                 PUBLIC _V1
  34.                 PUBLIC _U2
  35.                 PUBLIC _V2
  36.                 PUBLIC _U3
  37.                 PUBLIC _V3
  38.                 PUBLIC _I1
  39.                 PUBLIC _I2
  40.                 PUBLIC _I3
  41.                 PUBLIC _A1
  42.                 PUBLIC _A2
  43.                 PUBLIC _A3
  44.                 PUBLIC _ColorIndex
  45.                 PUBLIC _TransLevel
  46.         PUBLIC _AvgZ
  47.         PUBLIC _RendBuffer
  48.                        
  49. _DATA           SEGMENT 'DATA' USE32
  50.  
  51. ; Export data         
  52.                 _MinClipX     dd 0
  53.                 _MaxClipX     dd 0 
  54.                 _MinClipY     dd 0
  55.                 _MaxClipY     dd 0
  56.                 _ScreenWidth  dd 0
  57.         _LookPAL      dd 0
  58.         _LookPALptr   dd 0
  59.                 _X1           dd 0
  60.                 _X2           dd 0
  61.                 _X3           dd 0
  62.                 _Y1           dd 0
  63.                 _Y2           dd 0
  64.                 _Y3           dd 0
  65.                 _Z1           dd 0
  66.                 _Z2           dd 0
  67.                 _Z3           dd 0
  68.                 _U1           dd 0
  69.                 _V1           dd 0
  70.                 _U2           dd 0
  71.                 _V2           dd 0
  72.                 _U3           dd 0
  73.                 _V3           dd 0
  74.                 _I1           dd 0
  75.                 _I2           dd 0
  76.                 _I3           dd 0
  77.                 _A1           dd 0
  78.                 _A2           dd 0
  79.                 _A3           dd 0
  80.                 _ColorIndex   dd 0
  81.                 _TransLevel   dd 0
  82.         _AvgZ         dd 0
  83.         _RendBuffer   dd 0
  84.         
  85. ; Locals
  86.                 _oldx3        dd 0
  87.         _oldy3        dd 0
  88.         _oldi3        dd 0
  89.         _LeftX        dd 0
  90.         _RightX       dd 0
  91.         _LeftI        dd 0
  92.         _RightI       dd 0
  93.         _MiddleI      dd 0
  94.                 _LeftDx       dd 0
  95.                 _RightDx      dd 0
  96.         _LeftDi       dd 0
  97.         _RightDi      dd 0
  98.         _MiddleDi     dd 0
  99.         _Width        dd 0
  100.                 _GENERAL      dd 0
  101.                 _color        dd 0
  102.             _Count        dd 0
  103.         _Temp         dd 0
  104.             
  105. _DATA           ENDS
  106.  
  107. _TEXT           SEGMENT PUBLIC 'CODE' USE32
  108.  
  109.                 ; ARG Buffer-->edi color-->eax count-->ecx 
  110.  
  111. Line   PROC    NEAR
  112.          
  113.          mov ah,al
  114.          mov ebx,eax
  115.          sal ebx,16
  116.          or eax,ebx
  117.          push ecx
  118.          and ecx,0x00000003
  119.          rep stosb
  120.          pop ecx
  121.          sar ecx,2
  122.          rep stosd
  123.          cld                   ; Direction bit must be clear on exit.
  124.          ret
  125.  
  126. Line   ENDP
  127.  
  128. Scan_Convert_Lambert PROC NEAR
  129.  
  130.          push ebp
  131.          push esi
  132.          push edi  
  133.      
  134.          mov eax,_X2
  135.          cmp eax,_X1
  136.          jne @@CheckY_L
  137.          cmp eax,_X3
  138.          je  @@TheEnd_L
  139.      
  140. @@CheckY_L:
  141.  
  142.          mov eax,_Y2
  143.          cmp eax,_Y1
  144.          jne @@CheckY2Y1_L
  145.          cmp eax,_Y3
  146.          je @@TheEnd_L   
  147.  
  148. @@CheckY2Y1_L:
  149.  
  150.          cmp eax,_Y1
  151.          jge @@CheckY3Y1_L
  152.          mov edx,_X1
  153.          mov ecx,_X2
  154.          mov _X1,ecx         ; _X1=_X2
  155.          mov _X2,edx         ; _X2=_X1
  156.          mov edx,_Y1         
  157.          mov _Y2,edx         ; _Y1=_Y2
  158.          mov _Y1,eax         ; _Y2=_Y1
  159.  
  160. @@CheckY3Y1_L:
  161.  
  162.          mov eax,_Y3
  163.          cmp eax,_Y1
  164.          jge @@CheckY3Y2_L
  165.          mov ebx,_X1
  166.          mov ecx,_X3
  167.          mov _X1,ecx         ; _X1=_X3
  168.          mov _X3,ebx         ; _X3=_X1
  169.          mov ebx,_Y1 
  170.          mov _Y1,eax         ; _Y1=_Y3
  171.          mov _Y3,ebx         ; _Y3=_Y1
  172.  
  173. @@CheckY3Y2_L:
  174.  
  175.          mov eax,_Y2
  176.          cmp eax,_Y3
  177.          jle @@Skip1_L
  178.          mov ebx,_X2
  179.          mov ecx,_X3
  180.          mov _X2,ecx         ; _X2=_X3
  181.          mov _X3,ebx         ; _X3=_X2
  182.          mov ebx,_Y3
  183.          mov _Y3,eax         ; _Y3=_Y2
  184.          mov _Y2,ebx         ; _Y2=_Y3
  185.  
  186. @@Skip1_L:                               
  187.  
  188.          mov eax,_Y3
  189.          cmp eax,_MinClipY   
  190.          jl @@TheEnd_L
  191.          mov eax,_Y1
  192.          cmp eax,_MaxClipY
  193.          jg @@TheEnd_L   
  194.          mov eax,_MinClipX              
  195.          mov ebx,_MaxClipX      
  196.          cmp eax,_X1
  197.          jle @@CheckXtents_L
  198.          cmp eax,_X2
  199.          jle @@CheckXtents_L
  200.          cmp eax,_X3
  201.          jg  @@TheEnd_L
  202.  
  203. @@CheckXtents_L:
  204.  
  205.          cmp ebx,_X1
  206.          jge @@TheStart_L
  207.          cmp ebx,_X2
  208.          jge @@TheStart_L
  209.          cmp ebx,_X3
  210.          jl  @@TheEnd_L   
  211.  
  212. @@TheStart_L:                    ; now poly is in cliparea
  213.  
  214.          mov _GENERAL,0         ; reset flag
  215.          mov edi,_RendBuffer    
  216.      mov ebx,_LookPAL
  217.          mov ecx,_ColorIndex
  218.          mov al,BYTE PTR [ ebx + ecx ]     ; color=Look_Pal[ _ColorIndex ]
  219.          mov ah,al
  220.      mov ebx,eax
  221.      sal ebx,16
  222.      or  eax,ebx
  223.          mov _color,eax           ; replicate color 
  224.          mov eax,_Y2
  225.          cmp eax,_Y1
  226.          je  @@FLAT_TOP_L
  227.          cmp eax,_Y3
  228.          je  @@FLAT_BOTTOM_L
  229.          mov _GENERAL,1           ; GENERAL=TRUE        
  230.          mov eax,_X3
  231.          sub eax,_X1
  232.      sal eax,16
  233.          mov ebx,_Y3
  234.          sub ebx,_Y1
  235.          cdq
  236.      idiv ebx                   ; slope = ((_X3-_X1)<<16)/(_Y3-_Y1)
  237.          mov ebx,_Y2
  238.          sub ebx,_Y1
  239.      imul ebx
  240.      sar eax,16
  241.          add eax,_X1    
  242.          mov ebx,_X3
  243.          mov _oldx3,ebx
  244.          mov ebx,_Y3
  245.          mov _oldy3,ebx
  246.          mov _X3,eax               ; _X3=newx
  247.          mov ebx,_Y2
  248.          mov _Y3,ebx
  249.      
  250. @@FLAT_BOTTOM_L:                  
  251.          
  252.          mov eax,_X3         
  253.          cmp eax,_X2               ; if (_X3<_X2)
  254.          jge @@Skip2_L
  255.          mov ecx,_X2
  256.          mov _X2,eax
  257.          mov _X3,ecx
  258.  
  259. @@Skip2_L:
  260.          mov ebx,_Y3  
  261.          sub ebx,_Y1
  262.      mov eax,0x00010000    ; divide by 65536 (fixed point 16).
  263.          cdq
  264.      idiv ebx
  265.          mov ebx,_X2
  266.          sub ebx,_X1
  267.      mov ecx,eax
  268.      imul ebx
  269.          mov _LeftDx,eax         
  270.      mov eax,ecx
  271.          mov ebx,_X3
  272.          sub ebx,_X1
  273.      imul ebx
  274.          mov _RightDx,eax                   
  275.          mov ebx,_X1
  276.      sal ebx,16
  277.          mov _LeftX,ebx
  278.      add ebx,0x00008000
  279.          mov _RightX,ebx       ; RightX=LeftX+32768
  280.          mov eax,_MinClipY       
  281.          cmp eax,_Y1
  282.          jle @@Skip3_L
  283.      cmp eax,_Y3
  284.          jg  @@SecondHalf_L      ; the whole poly is clipped
  285.          sub eax,_Y1
  286.      mov ebx,eax
  287.          imul _LeftDx            
  288.          add eax,_LeftX
  289.          mov _LeftX,eax          
  290.      mov eax,ebx
  291.          imul _RightDx
  292.          add eax,_RightX         
  293.          mov _RightX,eax
  294.      mov eax,_MinClipY
  295.          mov _Y1,eax
  296.      
  297. @@Skip3_L:
  298.      
  299.          mov eax,_MaxClipY        
  300.          cmp eax,_Y3
  301.          jge @@Skip4_L
  302.      cmp eax,_Y1           ; the whole poly is clipped
  303.          jl  @@SecondHalf_L
  304.          mov _Y3,eax
  305.  
  306. @@Skip4_L:
  307.          mov eax,_Y1
  308.      mov ebx,eax
  309.          sal eax,8
  310.          sal ebx,6
  311.      add eax,ebx
  312.      add edi,eax             ; Buffer+=(_Y1<<8)+(_Y1<<6)
  313.  
  314.          jmp $+2                   ; clear prefetch queue
  315.  
  316.          mov eax,_X1
  317.          mov ebx,_MinClipX       
  318.          mov ecx,_MaxClipX      
  319.      cmp eax,ebx               ; if (_X1>=POLY_MIN_CLIP_X && _X1<=POLY_MAX_CLIP_X && etc.
  320.          jl  @@Clipped_L
  321.      cmp eax,ecx
  322.          jg  @@Clipped_L
  323.          mov eax,_X2
  324.      cmp eax,ebx
  325.          jl  @@Clipped_L
  326.      cmp eax,ecx
  327.          jg  @@Clipped_L
  328.          mov eax,_X3
  329.      cmp eax,ebx
  330.          jl  @@Clipped_L
  331.      cmp eax,ecx
  332.          jg  @@Clipped_L
  333.          mov ebp,_Y3
  334.          sub ebp,_Y1              ; edx holds count
  335.          mov ebx,_LeftX           
  336.          mov edx,_RightX
  337.          mov eax,_color
  338.      
  339. @@DoScanLine_L:
  340.  
  341.          cmp ebp,0
  342.          je  @@SecondHalf_L     
  343.      mov esi,ebx
  344.          sar esi,16
  345.      push edi                 ; save old place
  346.          add edi,esi              ; draw scanline
  347.      mov ecx,edx
  348.          sar ecx,16
  349.      sub ecx,esi
  350.      inc ecx
  351.      push ecx          ; save ecx 
  352.      and ecx,0x00000003
  353.          rep stosb     
  354.          pop ecx
  355.          sar ecx,2
  356.      rep stosd
  357.          add ebx,_LeftDx         
  358.          add edx,_RightDx        
  359.      pop edi               ; restore old position
  360.          add edi,_ScreenWidth    
  361.      dec ebp
  362.          jmp @@DoScanLine_L
  363.                      
  364. @@Clipped_L:     
  365.  
  366.          mov eax,_color
  367.          mov ebp,_Y3
  368.          sub ebp,_Y1
  369.          mov ebx,_LeftX
  370.          mov edx,_RightX
  371.  
  372. @@DoScanLineClip_L:
  373.      
  374.      cmp ebp,0
  375.          je  @@SecondHalf_L
  376.          mov esi,ebx 
  377.          sar esi,16
  378.      mov ecx,edx
  379.          sar ecx,16
  380.          cmp esi,_MinClipX
  381.          jge @@Skip5_L
  382.          cmp ecx,_MinClipX      
  383.          jl  @@Redo_L
  384.          mov esi,_MinClipX      
  385.  
  386. @@Skip5_L:
  387.          
  388.          cmp ecx,_MaxClipX       
  389.          jle @@Skip6_L
  390.          cmp esi,_MaxClipX       
  391.          jg  @@Redo_L
  392.          mov ecx,_MaxClipX        
  393.      
  394. @@Skip6_L:
  395.          
  396.      push edi    
  397.          add edi,esi          ; draw scanline
  398.      sub ecx,esi
  399.      inc ecx
  400.          mov esi,ecx          ; save ecx
  401.      and ecx,0x00000003
  402.      rep stosb
  403.      mov ecx,esi
  404.          sar ecx,2
  405.      rep stosd
  406.          pop edi               ; restore old position
  407.  
  408. @@Redo_L:        
  409.  
  410.          add ebx,_LeftDx        
  411.          add edx,_RightDx          
  412.          add edi,_ScreenWidth  ; move to next scanline
  413.      dec ebp
  414.          jmp @@DoScanLineClip_L
  415.      
  416. @@SecondHalf_L:
  417.          
  418.          cmp _GENERAL,0       ; if not GENERAL Triangle goto end
  419.          je  @@TheEnd_L
  420.          mov eax,_X2          ; setup for bottom half
  421.          mov _X1,eax
  422.          mov eax,_Y2
  423.          mov _Y1,eax
  424.          mov eax,_X3
  425.          mov _X2,eax
  426.          mov eax,_oldx3
  427.          mov _X3,eax
  428.          mov eax,_oldy3
  429.          mov _Y3,eax
  430.          mov edi,_RendBuffer
  431.      
  432. @@FLAT_TOP_L:
  433.  
  434.          mov eax,_X2
  435.          cmp eax,_X1
  436.          jge @@Skip7_L
  437.          mov ebx,_X1
  438.          mov _X2,ebx
  439.          mov _X1,eax
  440.           
  441. @@Skip7_L:
  442.      
  443.          mov ebx,_Y3
  444.          sub ebx,_Y1
  445.      mov eax,0x00010000         ; eax=65536
  446.          cdq
  447.      idiv ebx
  448.      mov ebx,eax                ; save height          
  449.          mov ecx,_X3
  450.          sub ecx,_X1
  451.      imul ecx
  452.          mov _LeftDx,eax        
  453.      mov eax,ebx           ; restore eax
  454.          mov ecx,_X3
  455.          sub ecx,_X2
  456.      imul ecx
  457.          mov _RightDx,eax          
  458.          mov eax,_X1
  459.          sal eax,16
  460.          mov _LeftX,eax
  461.          mov eax,_X2
  462.          sal eax,16
  463.      add eax,0x00008000    ; add 0.5 to it
  464.          mov _RightX,eax
  465.          mov eax,_MinClipY         
  466.          cmp eax,_Y1
  467.          jle @@Skip8_L
  468.      cmp eax,_Y3
  469.          jg  @@TheEnd_L          ; poly is totally clipped
  470.          sub eax,_Y1
  471.      mov ecx,eax
  472.          imul _LeftDx
  473.          add eax,_LeftX
  474.          mov _LeftX,eax
  475.      mov eax,ecx
  476.          imul _RightDx
  477.          add eax,_RightX
  478.          mov _RightX,eax
  479.      mov ebx,_MinClipY
  480.          mov _Y1,ebx           ; _Y1=POLY_MIN_CLIP_Y     
  481.  
  482. @@Skip8_L:
  483.          
  484.          mov eax,_MaxClipY      
  485.          cmp eax,_Y3
  486.          jge @@Skip9_L
  487.      cmp eax,_Y1
  488.          jl  @@TheEnd_L
  489.          mov _Y3,eax
  490.      
  491. @@Skip9_L:
  492.               
  493.          mov eax,_Y1
  494.      mov ebx,eax
  495.          sal eax,8
  496.          sal ebx,6
  497.      add eax,ebx
  498.      add edi,eax            ; Buffer+=(_Y1<<8)+(_Y1<<6)                  
  499.  
  500.          jmp $+2                   ; clear prefetch queue
  501.  
  502.          mov eax,_X1
  503.          mov ebx,_MinClipX      
  504.          mov ecx,_MaxClipX        
  505.      cmp eax,ebx               ; if (_X1>=POLY_MIN_CLIP_X && _X1<=POLY_MAX_CLIP_X && etc.
  506.          jl  @@Clipped2_L
  507.      cmp eax,ecx
  508.          jg  @@Clipped2_L
  509.          mov eax,_X2
  510.      cmp eax,ebx
  511.          jl  @@Clipped2_L
  512.      cmp eax,ecx
  513.          jg  @@Clipped2_L
  514.          mov eax,_X3
  515.      cmp eax,ebx
  516.          jl  @@Clipped2_L
  517.      cmp eax,ecx
  518.          jg  @@Clipped2_L
  519.          mov ebp,_Y3              ; Draw regular poly (no clip)
  520.          sub ebp,_Y1              ; edx holds count
  521.          mov ebx,_LeftX           
  522.          mov edx,_RightX
  523.          mov eax,_color
  524.      
  525. @@DoScanLine2_L:
  526.     
  527.      cmp ebp,0
  528.          je  @@TheEnd_L
  529.      mov esi,ebx
  530.          sar esi,16
  531.      push edi                 ; save old position
  532.      add edi,esi
  533.      mov ecx,edx
  534.          sar ecx,16
  535.      sub ecx,esi
  536.      inc ecx
  537.      push ecx          ; save ecx 
  538.      and ecx,0x00000003
  539.          rep stosb     
  540.          pop ecx
  541.          sar ecx,2
  542.      rep stosd
  543.          add ebx,_LeftDx         
  544.          add edx,_RightDx        
  545.      pop edi               ; restore old position
  546.          add edi,_ScreenWidth    
  547.      dec ebp
  548.          jmp @@DoScanLine2_L
  549.                      
  550. @@Clipped2_L:    
  551.  
  552.          mov eax,_color
  553.          mov ebp,_Y3
  554.          sub ebp,_Y1
  555.          mov ebx,_LeftX
  556.          mov edx,_RightX
  557.  
  558. @@DoScanLineClip2_L:
  559.      
  560.      cmp ebp,0
  561.          je  @@TheEnd_L
  562.          mov esi,ebx 
  563.          sar esi,16
  564.      mov ecx,edx
  565.          sar ecx,16
  566.          cmp esi,_MinClipX       
  567.          jge @@Skip10_L
  568.          cmp ecx,_MinClipX       
  569.          jl  @@Redo2_L
  570.          mov esi,_MinClipX      
  571.  
  572. @@Skip10_L:
  573.          
  574.          cmp ecx,_MaxClipX      
  575.          jle @@Skip11_L
  576.          cmp esi,_MaxClipX      
  577.          jg  @@Redo2_L
  578.          mov ecx,_MaxClipX        
  579.      
  580. @@Skip11_L:
  581.          
  582.      push edi             ; save old position    
  583.          add edi,esi
  584.      sub ecx,esi
  585.      inc ecx
  586.          mov esi,ecx          ; save ecx
  587.      and ecx,0x00000003
  588.      rep stosb
  589.      mov ecx,esi
  590.          sar ecx,2
  591.      rep stosd
  592.          pop edi               ; restore saved position
  593.  
  594. @@Redo2_L:
  595.  
  596.          add ebx,_LeftDx            
  597.          add edx,_RightDx           
  598.          add edi,_ScreenWidth
  599.      dec ebp
  600.          jmp @@DoScanLineClip2_L
  601.     
  602. @@TheEnd_L:
  603.          
  604.      pop  edi
  605.          pop  esi
  606.          pop  ebp
  607.  
  608.      cld
  609.      ret
  610.      
  611. Scan_Convert_Lambert ENDP
  612.  
  613. Scan_Convert_Gouraud PROC NEAR
  614.  
  615.          push ebp
  616.          push esi
  617.          push edi  
  618.      
  619.          mov eax,_X2
  620.          cmp eax,_X1
  621.          jne @@CheckY_G
  622.          cmp eax,_X3
  623.      je  @@TheEnd_G
  624.      
  625. @@CheckY_G:
  626.  
  627.          mov eax,_Y2
  628.          cmp eax,_Y1
  629.          jne @@CheckY2Y1_G
  630.          cmp eax,_Y3
  631.      je @@TheEnd_G     
  632.  
  633. @@CheckY2Y1_G:
  634.  
  635.          cmp eax,_Y1
  636.          jge @@CheckY3Y1_G
  637.          mov edx,_X1
  638.          mov ecx,_X2
  639.          mov _X1,ecx         ; _X1=_X2
  640.          mov _X2,edx         ; _X2=_X1
  641.          mov edx,_Y1         
  642.          mov _Y2,edx         ; _Y1=_Y2
  643.          mov _Y1,eax         ; _Y2=_Y1
  644.      mov eax,_I1
  645.      mov ebx,_I2
  646.      mov _I2,eax         ; _I2=_I1
  647.      mov _I1,ebx         ; _I1=_I2
  648.  
  649. @@CheckY3Y1_G:
  650.  
  651.          mov eax,_Y3
  652.          cmp eax,_Y1
  653.          jge @@CheckY3Y2_G
  654.          mov ebx,_X1
  655.          mov ecx,_X3
  656.          mov _X1,ecx         ; _X1=_X3
  657.          mov _X3,ebx         ; _X3=_X1
  658.          mov ebx,_Y1 
  659.          mov _Y1,eax         ; _Y1=_Y3
  660.          mov _Y3,ebx         ; _Y3=_Y1
  661.          mov eax,_I1
  662.      mov ebx,_I3
  663.      mov _I3,eax         ; _I3=_I1
  664.      mov _I1,ebx         ; _I1=_I3
  665.      
  666. @@CheckY3Y2_G:
  667.  
  668.          mov eax,_Y2
  669.          cmp eax,_Y3
  670.          jle @@Skip1_G 
  671.          mov ebx,_X2
  672.          mov ecx,_X3
  673.          mov _X2,ecx         ; _X2=_X3
  674.          mov _X3,ebx         ; _X3=_X2
  675.          mov ebx,_Y3
  676.          mov _Y3,eax         ; _Y3=_Y2
  677.          mov _Y2,ebx         ; _Y2=_Y3
  678.          mov eax,_I2
  679.      mov ebx,_I3
  680.      mov _I2,ebx         ; _I2=_I3
  681.      mov _I3,eax         ; _I3=_I2
  682.      
  683. @@Skip1_G:                      
  684.  
  685.          mov eax,_Y3
  686.          cmp eax,_MinClipY   
  687.          jl @@TheEnd_G
  688.          mov eax,_Y1
  689.          cmp eax,_MaxClipY         
  690.      jg @@TheEnd_G     
  691.          mov eax,_MinClipX              
  692.          mov ebx,_MaxClipX      
  693.          cmp eax,_X1
  694.          jle @@CheckXtents_G
  695.          cmp eax,_X2
  696.          jle @@CheckXtents_G
  697.          cmp eax,_X3
  698.      jg  @@TheEnd_G
  699.  
  700. @@CheckXtents_G:
  701.  
  702.          cmp ebx,_X1
  703.          jge @@TheStart_G
  704.          cmp ebx,_X2
  705.          jge @@TheStart_G
  706.          cmp ebx,_X3
  707.      jl  @@TheEnd_G         
  708.  
  709. @@TheStart_G:                     ; now poly is in cliparea
  710.  
  711.          mov _GENERAL,0         ; reset flag
  712.          mov edi,_RendBuffer    
  713.  
  714.          mov esi,_LookPAL
  715.      add esi,_ColorIndex      ; LookPAL[ _ColorIndex + (MiddleI>>16) ]
  716.  
  717.          mov eax,_Y2
  718.          cmp eax,_Y1
  719.      je  @@FLAT_TOP_G
  720.          cmp eax,_Y3
  721.          je  @@FLAT_BOTTOM_G
  722.          mov _GENERAL,1           ; GENERAL=TRUE        
  723.          mov eax,0x00010000       ; 65536
  724.      cdq 
  725.          mov ebx,_Y3
  726.          sub ebx,_Y1
  727.      div ebx                  
  728.          mov ebp,eax              ; save height
  729.          mov ebx,_x3
  730.      sub ebx,_x1
  731.      imul ebx 
  732.          mov ebx,_Y2
  733.          sub ebx,_Y1
  734.      imul ebx
  735.      sar eax,16
  736.          add eax,_X1              ; newx
  737.          mov ebx,_X3
  738.          mov _oldx3,ebx
  739.          mov ebx,_Y3
  740.          mov _oldy3,ebx
  741.      mov ebx,_I3
  742.      mov _oldi3,ebx
  743.          mov _X3,eax               ; _X3=newx
  744.          mov eax,_Y2
  745.      sub eax,_Y1
  746.      imul _I3
  747.      mov ebx,eax
  748.      mov eax,_Y3
  749.      sub eax,_Y2
  750.      imul _I1
  751.      add eax,ebx
  752.      imul ebp                   ; multiply by height
  753.      sar eax,16                 ; holds newi             
  754.          mov _I3,eax                ; _I3=newi     
  755.      mov ebx,_Y2               ; _Y3=_Y2
  756.          mov _Y3,ebx
  757.      
  758. @@FLAT_BOTTOM_G:           
  759.          
  760.          mov eax,_X3         
  761.          cmp eax,_X2               ; if (_X3<_X2)
  762.          jge @@Skip2_G
  763.          mov ecx,_X2
  764.          mov _X2,eax
  765.          mov _X3,ecx
  766.      mov eax,_I3
  767.      mov ebx,_I2
  768.      mov _I3,ebx
  769.      mov _I2,eax
  770.  
  771. @@Skip2_G:
  772.  
  773.          mov ebx,_Y2
  774.          sub ebx,_Y1
  775.      mov eax,0x00010000    ; divide by 65536 (fixed point 16).
  776.          cdq
  777.      idiv ebx              
  778.      mov ecx,eax           ; save height
  779.          mov eax,_X2
  780.          sub eax,_X1
  781.      imul ecx
  782.          mov _LeftDx,eax      
  783.          mov eax,_X3
  784.          sub eax,_X1
  785.      imul ecx
  786.          mov _RightDx,eax     
  787.      
  788.          mov ebx,_X1
  789.      sal ebx,16
  790.          mov _LeftX,ebx
  791.      add ebx,0x00008000
  792.          mov _RightX,ebx       ; RightX=LeftX+32768
  793.  
  794.          mov eax,_I1
  795.      sal eax,16
  796.      mov _LeftI,eax
  797.      mov _RightI,eax
  798.  
  799.      mov eax,_I2
  800.      sub eax,_I1
  801.      imul ecx
  802.      mov _leftDi,eax
  803.      mov eax,_I3
  804.      sub eax,_I1
  805.      imul ecx
  806.      mov _RightDi,eax
  807.      mov _MiddleDi,0          
  808.  
  809.          mov eax,_MinClipY     ; if (_Y1 < POLY_MIN_CLIP_Y)
  810.          cmp eax,_Y1
  811.          jle @@Skip3_G
  812.        cmp eax,_Y3
  813.        jg  @@SecondHalf_G      ; the whole poly is clipped
  814.              sub eax,_Y1           
  815.          mov ebx,eax           ; save ydiff
  816.              imul _LeftDx          
  817.              add _LeftX,eax       
  818.          mov eax,ebx
  819.              imul _RightDx
  820.              add _RightX,eax
  821.  
  822.              mov eax,ebx
  823.          imul _LeftDi
  824.          add _LeftI,eax
  825.              mov eax,ebx
  826.          imul _RightDi
  827.          add _RightI,eax
  828.          
  829.          mov eax,_RightI         
  830.          sub eax,_LeftI
  831.              cdq         
  832.          mov ebx,_RightX
  833.          sub ebx,_LeftX
  834.          sar ebx,16             ; get whole number
  835.          inc ebx                ; to avoid divide by 0
  836.          idiv ebx
  837.          mov _MiddleDi,eax               
  838.          
  839.          mov eax,_MinClipY
  840.              mov _Y1,eax
  841.      
  842. @@Skip3_G:
  843.     
  844.          mov eax,_MaxClipY        
  845.          cmp eax,_Y3
  846.          jge @@Skip4_G
  847.      cmp eax,_Y1           ; the whole poly is clipped
  848.      jl  @@TheEnd_G
  849.  
  850.          mov _Y3,eax
  851.  
  852. @@Skip4_G:
  853.  
  854.          mov eax,_Y1             ; optimized for 320x200
  855.      mov ebx,eax
  856.          sal eax,8
  857.          sal ebx,6
  858.      add eax,ebx
  859.      add edi,eax             ; Buffer+=(_Y1<<8)+(_Y1<<6)
  860.  
  861.          jmp $+2                 ; clear prefetch queue
  862.  
  863.          mov eax,_X1
  864.          mov ebx,_MinClipX       
  865.          mov ecx,_MaxClipX      
  866.      cmp eax,ebx               ; if (_X1>=POLY_MIN_CLIP_X && _X1<=POLY_MAX_CLIP_X && etc.
  867.      jl  @@Clipped_G
  868.      cmp eax,ecx
  869.      jg  @@Clipped_G
  870.          mov eax,_X2
  871.      cmp eax,ebx
  872.      jl  @@Clipped_G
  873.      cmp eax,ecx
  874.      jg  @@Clipped_G
  875.          mov eax,_X3
  876.      cmp eax,ebx
  877.      jl  @@Clipped_G
  878.      cmp eax,ecx
  879.      jg  @@Clipped_G
  880.  
  881.          mov ebp,_Y3
  882.          sub ebp,_Y1              ; count
  883.          mov _Count,ebp
  884.      
  885.          mov eax,_LeftX           
  886.          mov edx,_RightX
  887.      mov ebx,_LeftI
  888.      mov ecx,_RightI
  889.  
  890.      push eax                 ; need regs ( Crappy Intel )
  891.      push edx 
  892.      push edi                 ; save old place
  893.          
  894.          shr eax,16
  895.          add edi,eax              ; mov to required point
  896.          shr edx,16
  897.      sub edx,eax
  898.      inc edx
  899.      mov ebp,edx
  900.      mov eax,edi              ; read in edi into active cache
  901.          mov eax,_LeftI           ; start at left end
  902.  
  903. @@DoScanLine_G:
  904.  
  905.          cmp _Count,0
  906.      je  @@Cleanup_G
  907.  
  908. @@DoInnerScanLine_G:
  909.  
  910.          cmp ebp,0                  ; inner for loop
  911.      je  @@DoUpdateData_G
  912.  
  913.        mov edx,eax              ; get MiddleI
  914.          sar edx,16               ; get whole part             
  915.        mov dl,BYTE PTR [ esi+edx ]
  916.            mov [edi],dl
  917.        inc edi
  918.            add eax,_MiddleDi;
  919.        dec ebp
  920.      jmp @@DoInnerScanLine_G
  921.  
  922. @@DoUpdateData_G:
  923.  
  924.            add ebx,_LeftDi
  925.        add ecx,_RightDi 
  926.            pop edi
  927.        pop edx
  928.        pop eax
  929.        add eax,_LeftDx
  930.        add edx,_RightDx
  931.        add edi,_ScreenWidth                  
  932.        push eax                
  933.        push edx               
  934.        push edi                 ; save old place              
  935.        shr eax,16               ; get whole part
  936.            add edi,eax              ; move buffer into postion
  937.            shr edx,16
  938.        sub edx,eax
  939.        inc edx
  940.        mov ebp,edx              ; holds horiz count  
  941.        mov eax,ecx            
  942.        sub eax,ebx
  943.        cdq
  944.          idiv ebp                       
  945.            mov _MiddleDi,eax       
  946.        mov eax,ebx              ; Start MiddleI from LeftI
  947.            mov edx,edi              ; get buffer in active cache       
  948.        dec _Count
  949.          jmp @@DoScanLine_G
  950.                      
  951. @@Clipped_G:     
  952.  
  953.          mov ebp,_Y3
  954.          sub ebp,_Y1
  955.      mov _Count,ebp
  956.  
  957.          mov eax,_LeftX           
  958.          mov edx,_RightX
  959.      mov ebx,_LeftI
  960.      mov _MiddleI,ebx         ; start MiddleI at LeftI
  961.      mov ecx,_RightI
  962.  
  963.      push eax                
  964.      push edx 
  965.      push edi                 ; save old place
  966.      
  967. @@DoScanLineClip_G:
  968.      
  969.      cmp _Count,0
  970.      je  @@Cleanup_G
  971.  
  972.           sar eax,16               ; ClipLeftX
  973.           sar edx,16               ; ClipRightX
  974.       
  975.       cmp eax,_MinClipX
  976.       jge @@Skip6_G
  977.             cmp edx,_MinClipX
  978.             jge @@Skip5_G
  979.               pop edi
  980.           pop edx
  981.                 pop eax
  982.           add eax,_LeftDx
  983.           add edx,_RightDx
  984.           add edi,_ScreenWidth
  985.           push eax
  986.           push edx
  987.           push edi
  988.           add ebx,_LeftDi
  989.           add ecx,_RightDi
  990.           dec _Count
  991.          jmp @@DoScanLineClip_G
  992.          
  993. @@Skip5_G:
  994.          
  995.      mov ebp,edx       ; will be obliterated by imul
  996.      sub eax,_MinClipX
  997.      neg eax
  998.      imul _MiddleDi 
  999.      add eax,ebx       ; Add LeftI
  1000.      mov _MiddleI,eax
  1001.      mov eax,_MinClipX           
  1002.      mov edx,ebp       ; restore ClipRightX
  1003.       
  1004. @@Skip6_G:
  1005.      
  1006.      cmp edx,_MaxClipX
  1007.      jle @@Skip8_G
  1008.            cmp eax,_MaxClipX
  1009.        jle @@Skip7_G
  1010.              pop edi
  1011.          pop edx
  1012.                pop eax
  1013.          add eax,_LeftDx
  1014.          add edx,_RightDx
  1015.          add edi,_ScreenWidth
  1016.          push eax
  1017.          push edx
  1018.          push edi
  1019.              add ebx,_LeftDi
  1020.              add ecx,_RightDi
  1021.              dec _Count
  1022.          jmp @@DoScanLineClip_G
  1023.           
  1024. @@Skip7_G:
  1025.  
  1026.          mov edx,_MaxClipX     
  1027.  
  1028. @@Skip8_G:
  1029.       
  1030.          add edi,eax              ; mov to required point
  1031.      sub edx,eax
  1032.      inc edx
  1033.      mov ebp,edx              ; horiz count
  1034.      mov eax,edi              ; read in edi into active cache
  1035.          mov eax,_MiddleI
  1036.  
  1037. @@DoInnerScanLineClip_G:
  1038.  
  1039.          cmp ebp,0                  ; inner for loop
  1040.      je  @@DoUpdateDataClip_G
  1041.        mov edx,eax              ; get MiddleI
  1042.          sar edx,16               ; get whole part             
  1043.            mov dl,BYTE PTR [ esi+edx ]
  1044.            mov [edi],dl
  1045.         inc edi
  1046.            add eax,_MiddleDi;
  1047.        dec ebp
  1048.      jmp @@DoInnerScanLineClip_G
  1049.  
  1050. @@DoUpdateDataClip_G:
  1051.  
  1052.            add ebx,_LeftDi
  1053.        add ecx,_RightDi 
  1054.            pop edi
  1055.        pop edx
  1056.        pop eax
  1057.        add eax,_LeftDx
  1058.        add edx,_RightDx
  1059.        add edi,_ScreenWidth                  
  1060.        push eax                
  1061.        push edx               
  1062.        push edi                 ; save old place              
  1063.            mov ebp,eax             
  1064.        mov _Temp,edx
  1065.            sub edx,eax
  1066.        sar edx,16
  1067.        inc edx
  1068.        mov _Width,edx
  1069.        mov eax,ecx
  1070.        sub eax,ebx 
  1071.            cdq
  1072.        idiv _Width
  1073.            mov _MiddleDi,eax       
  1074.        mov _MiddleI,ebx              ; Start MiddleI from LeftI
  1075.            mov eax,ebp                   ; restore LeftX, RightX
  1076.        mov edx,_Temp       
  1077.        dec _Count
  1078.          jmp @@DoScanLineClip_G
  1079.            
  1080. @@Cleanup_G:
  1081.  
  1082.          pop edi 
  1083.      pop edx
  1084.      pop eax
  1085.                                   
  1086. @@SecondHalf_G:
  1087.          
  1088.          cmp _GENERAL,0       ; if not GENERAL Triangle goto end
  1089.      je  @@TheEnd_G
  1090.  
  1091.          mov eax,_X2          ; setup for bottom half
  1092.          mov _X1,eax
  1093.          mov eax,_Y2
  1094.          mov _Y1,eax
  1095.      mov eax,_I2
  1096.      mov _I1,eax
  1097.  
  1098.          mov eax,_X3
  1099.          mov _X2,eax
  1100.      mov eax,_I3
  1101.      mov _I2,eax
  1102.  
  1103.          mov eax,_oldx3
  1104.          mov _X3,eax
  1105.          mov eax,_oldy3
  1106.          mov _Y3,eax
  1107.      mov eax,_oldi3
  1108.      mov _I3,eax
  1109.  
  1110.          mov edi,_RendBuffer
  1111.      
  1112. @@FLAT_TOP_G:
  1113.  
  1114.          mov eax,_X2
  1115.          cmp eax,_X1
  1116.          jge @@Skip9_G
  1117.          mov ebx,_X1
  1118.          mov _X2,ebx
  1119.          mov _X1,eax
  1120.      mov eax,_I2
  1121.      mov ebx,_I1
  1122.      mov _I2,ebx
  1123.      mov _I1,eax
  1124.           
  1125. @@Skip9_G:
  1126.      
  1127.          mov ebx,_Y3
  1128.          sub ebx,_Y1
  1129.      mov eax,0x00010000         ; eax=65536
  1130.          cdq
  1131.      idiv ebx
  1132.      mov ebx,eax                ; save height          
  1133.          mov eax,_X3
  1134.          sub eax,_X1
  1135.      imul ebx
  1136.          mov _LeftDx,eax     
  1137.          mov eax,_X3
  1138.          sub eax,_X2
  1139.      imul ebx
  1140.          mov _RightDx,eax    
  1141.  
  1142.          mov eax,_X1
  1143.          sal eax,16
  1144.          mov _LeftX,eax
  1145.          mov eax,_X2
  1146.          sal eax,16
  1147.      add eax,0x00008000    ; add 0.5 to it
  1148.          mov _RightX,eax
  1149.  
  1150.          mov eax,_I1
  1151.      sal eax,16
  1152.      mov _LeftI,eax
  1153.      mov eax,_I2
  1154.      sal eax,16
  1155.      mov _RightI,eax
  1156.  
  1157.          mov eax,_I3
  1158.      sub eax,_I1
  1159.      imul ebx              ; multiply times height
  1160.      mov _LeftDi,eax
  1161.      mov eax,_I3
  1162.      sub eax,_I2
  1163.      imul ebx                
  1164.      mov _RightDi,eax
  1165.      mov eax,_RightI
  1166.      sub eax,_LeftI
  1167.      cdq
  1168.      mov ebx,_RightX
  1169.      sub ebx,_LeftX
  1170.      sar ebx,16
  1171.      inc ebx
  1172.      idiv ebx
  1173.      mov _MiddleDi,eax 
  1174.  
  1175.          mov ebx,_MinClipY         
  1176.          cmp ebx,_Y1
  1177.          jle @@Skip10_G
  1178.      cmp ebx,_Y3
  1179.      jg  @@TheEnd_G           ; poly is totally clipped
  1180.          sub ebx,_Y1              ; ydiff
  1181.      mov eax,ebx
  1182.          imul _LeftDx
  1183.          add _LeftX,eax
  1184.      mov eax,ebx
  1185.          imul _RightDx
  1186.          add _RightX,eax
  1187.  
  1188.      mov eax,ebx
  1189.      imul _LeftDi
  1190.      add _LeftI,eax
  1191.      mov eax,ebx
  1192.      imul _RightDi
  1193.      add _RightI,eax
  1194.      
  1195.          mov eax,_RightI
  1196.      sub eax,_LeftI
  1197.      cdq
  1198.      mov ebx,_RightX
  1199.      sub ebx,_LeftX
  1200.      sar ebx,16
  1201.      inc ebx
  1202.      idiv ebx
  1203.      mov _MiddleDi,eax 
  1204.      
  1205.      mov ebx,_MinClipY
  1206.          mov _Y1,ebx           ; _Y1=POLY_MIN_CLIP_Y     
  1207.  
  1208. @@Skip10_G:
  1209.          
  1210.          mov eax,_MaxClipY      
  1211.          cmp eax,_Y3
  1212.          jge @@Skip11_G
  1213.      cmp eax,_Y1
  1214.      jl  @@TheEnd_G
  1215.  
  1216.          mov _Y3,eax
  1217.      
  1218. @@Skip11_G:
  1219.               
  1220.          mov eax,_Y1
  1221.      mov ebx,eax
  1222.          sal eax,8
  1223.          sal ebx,6
  1224.      add eax,ebx
  1225.      add edi,eax            ; Buffer+=(_Y1<<8)+(_Y1<<6)                  
  1226.  
  1227.          jmp $+2                   ; clear prefetch queue
  1228.  
  1229.          mov eax,_X1
  1230.          mov ebx,_MinClipX      
  1231.          mov ecx,_MaxClipX        
  1232.      cmp eax,ebx               ; if (_X1>=POLY_MIN_CLIP_X && _X1<=POLY_MAX_CLIP_X && etc.
  1233.      jl  @@Clipped2_G
  1234.      cmp eax,ecx
  1235.      jg  @@Clipped2_G
  1236.          mov eax,_X2
  1237.      cmp eax,ebx
  1238.      jl  @@Clipped2_G
  1239.      cmp eax,ecx
  1240.      jg  @@Clipped2_G
  1241.          mov eax,_X3
  1242.      cmp eax,ebx
  1243.      jl  @@Clipped2_G
  1244.      cmp eax,ecx
  1245.      jg  @@Clipped2_G
  1246.  
  1247.          mov ebp,_Y3
  1248.          sub ebp,_Y1              ; count
  1249.          mov _Count,ebp
  1250.      
  1251.          mov eax,_LeftX           
  1252.          mov edx,_RightX
  1253.      mov ebx,_LeftI
  1254.      mov ecx,_RightI
  1255.  
  1256.      push eax               
  1257.      push edx 
  1258.      push edi                 ; save old place
  1259.          
  1260.          shr eax,16
  1261.          add edi,eax              ; mov to required point
  1262.          shr edx,16
  1263.      sub edx,eax
  1264.      inc edx
  1265.      mov ebp,edx
  1266.      mov eax,edi              ; read in edi into active cache
  1267.          mov eax,_LeftI           ; start at left end
  1268.  
  1269. @@DoScanLine2_G:
  1270.  
  1271.          cmp _Count,0
  1272.      je  @@Cleanup2_G
  1273.  
  1274. @@DoInnerScanLine2_G:
  1275.  
  1276.          cmp ebp,0                  ; inner for loop
  1277.      je  @@DoUpdateData2_G
  1278.  
  1279.        mov edx,eax              ; get MiddleI
  1280.          sar edx,16               ; get whole part             
  1281.            mov dl,BYTE PTR [ esi+edx ]
  1282.            mov [edi],dl
  1283.         inc edi
  1284.            add eax,_MiddleDi;
  1285.        dec ebp
  1286.      jmp @@DoInnerScanLine2_G
  1287.  
  1288. @@DoUpdateData2_G:
  1289.  
  1290.            add ebx,_LeftDi
  1291.        add ecx,_RightDi 
  1292.            pop edi
  1293.        pop edx
  1294.        pop eax
  1295.        add eax,_LeftDx
  1296.        add edx,_RightDx
  1297.        add edi,_ScreenWidth                  
  1298.        push eax                
  1299.        push edx               
  1300.        push edi                 ; save old place              
  1301.        shr eax,16               ; get whole part
  1302.            add edi,eax              ; move buffer into postion
  1303.            shr edx,16
  1304.        sub edx,eax
  1305.        inc edx
  1306.        mov ebp,edx              ; holds horiz count  
  1307.        mov eax,ecx            
  1308.        sub eax,ebx
  1309.        cdq
  1310.          idiv ebp                       
  1311.            mov _MiddleDi,eax       
  1312.        mov eax,ebx              ; Start MiddleI from LeftI
  1313.            mov edx,edi              ; get buffer in active cache       
  1314.        dec _Count
  1315.  
  1316.          jmp @@DoScanLine2_G
  1317.                      
  1318. @@Clipped2_G:     
  1319.  
  1320.          mov ebp,_Y3
  1321.          sub ebp,_Y1
  1322.      mov _Count,ebp
  1323.  
  1324.          mov eax,_LeftX           
  1325.          mov edx,_RightX
  1326.      mov ebx,_LeftI
  1327.      mov _MiddleI,ebx         ; start MiddleI at LeftI
  1328.      mov ecx,_RightI
  1329.  
  1330.      push eax                
  1331.      push edx 
  1332.      push edi                 ; save old place
  1333.      
  1334. @@DoScanLineClip2_G:
  1335.      
  1336.      cmp _Count,0
  1337.      je  @@Cleanup2_G
  1338.  
  1339.           sar eax,16               ; ClipLeftX
  1340.           sar edx,16               ; ClipRightX
  1341.       
  1342.       cmp eax,_MinClipX
  1343.       jge @@Skip13_G
  1344.             cmp edx,_MinClipX
  1345.             jge @@Skip12_G
  1346.               pop edi
  1347.           pop edx
  1348.                 pop eax
  1349.           add eax,_LeftDx
  1350.           add edx,_RightDx
  1351.           add edi,_ScreenWidth
  1352.           push eax
  1353.           push edx
  1354.           push edi
  1355.           add ebx,_LeftDi
  1356.           add ecx,_RightDi
  1357.           dec _Count
  1358.          jmp @@DoScanLineClip2_G
  1359.          
  1360. @@Skip12_G:
  1361.  
  1362.          mov ebp,edx       ; save edx
  1363.      sub eax,_MinClipX
  1364.      neg eax
  1365.      imul _MiddleDi 
  1366.      add eax,ebx       ; Add LeftI
  1367.      mov _MiddleI,eax
  1368.      mov eax,_MinClipX           
  1369.      mov edx,ebp
  1370.       
  1371. @@Skip13_G:
  1372.      
  1373.      cmp edx,_MaxClipX
  1374.      jle @@Skip15_G
  1375.            cmp eax,_MaxClipX
  1376.        jle @@Skip14_G
  1377.              pop edi
  1378.          pop edx
  1379.                pop eax
  1380.          add eax,_LeftDx
  1381.          add edx,_RightDx
  1382.          add edi,_ScreenWidth
  1383.          push eax
  1384.          push edx
  1385.          push edi
  1386.              add ebx,_LeftDi
  1387.              add ecx,_RightDi
  1388.              dec _Count
  1389.          jmp @@DoScanLineClip2_G
  1390.           
  1391. @@Skip14_G:
  1392.  
  1393.          mov edx,_MaxClipX     
  1394.  
  1395. @@Skip15_G:
  1396.       
  1397.          add edi,eax              ; mov to required point
  1398.      sub edx,eax
  1399.      inc edx
  1400.      mov ebp,edx              ; horiz count
  1401.      mov eax,edi              ; read in edi into active cache
  1402.          mov eax,_MiddleI
  1403.  
  1404. @@DoInnerScanLineClip2_G:
  1405.  
  1406.          cmp ebp,0                  ; inner for loop
  1407.      je  @@DoUpdateDataClip2_G
  1408.        mov edx,eax              ; get MiddleI
  1409.          sar edx,16               ; get whole part             
  1410.            mov dl,BYTE PTR [ esi+edx ]
  1411.            mov [edi],dl
  1412.         inc edi
  1413.            add eax,_MiddleDi;
  1414.        dec ebp
  1415.      jmp @@DoInnerScanLineClip2_G
  1416.  
  1417. @@DoUpdateDataClip2_G:
  1418.  
  1419.            add ebx,_LeftDi
  1420.        add ecx,_RightDi 
  1421.            pop edi
  1422.        pop edx
  1423.        pop eax
  1424.        add eax,_LeftDx
  1425.        add edx,_RightDx
  1426.        add edi,_ScreenWidth                  
  1427.        push eax                
  1428.        push edx               
  1429.        push edi                 ; save old place              
  1430.            mov ebp,eax             
  1431.        mov _Temp,edx
  1432.            sub edx,eax
  1433.        sar edx,16
  1434.        inc edx
  1435.        mov _Width,edx
  1436.        mov eax,ecx
  1437.        sub eax,ebx 
  1438.            cdq
  1439.        idiv _Width
  1440.            mov _MiddleDi,eax       
  1441.        mov _MiddleI,ebx              ; Start MiddleI from LeftI
  1442.            mov eax,ebp                   ; restore LeftX, RightX
  1443.        mov edx,_Temp       
  1444.        dec _Count
  1445.          jmp @@DoScanLineClip2_G
  1446.                           
  1447. @@Cleanup2_G:
  1448.  
  1449.          pop edi            ; pop regs that have been previously pushed.
  1450.      pop edx
  1451.      pop eax
  1452.  
  1453. @@TheEnd_G:
  1454.  
  1455.          pop  edi
  1456.          pop  esi
  1457.          pop  ebp
  1458.  
  1459.      cld
  1460.      ret
  1461. Scan_Convert_Gouraud ENDP
  1462.  
  1463. _TEXT            ENDS
  1464.  
  1465. END
  1466.